/* 数组 */
'use strict'

// Array 可以包含任意数据类型，并通过索引访问每个元素
var arr = [1, 2, 3.14159265, 'Hello', null, true, ['hell', 1]];

// length 属性用于访问长度
arr.length; // -> 7
// * 直接给 length 赋值会导致 Array 大小的变化
//   赋小了会截断数组，丢掉后面的部分
//   赋大了会拉长数组，多出来的部分是 undefined

// 修改内容用索引修改，如果用变量名修改相当于给数组重新赋值
arr[0] = 10;
// arr -> [10, 2, 3.14159265, 'Hello', null, true, ['hell', 1]];
arr = 10;
// arr -> 10;

// 如果用索引赋值时，索引超出了数组长度，也会导致上面的问题，
// 多出来的地方用 undefined 填充
arr = [1, 2, 3];
arr[5] = '5';
// arr -> [0, 1, 2, 3, undefined, 5];

/* indexOf */
// 同字符串，返回元素的位置，不存在返回 -1
arr = [1, 2, 3.14, 'hello', true];
arr.indexOf('hello');   // -> 3
arr.indexOf(false);     // -> -1

/* slice */
// 切片，类似 string 的 substring
arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
startnum = 2;
endnum = 5;
arr.slice(startnum, endnum);

/* push and pop */
// push() 向 Array 末尾添加若干元素，返回新的数组长度；
// pop() 则删除掉 Array 中最后一个元素，返回 pop 出的元素
arr = [1, 2];
arr.push('a', 'B', true);
// <· 3
// arr -> [1, 2, 'a', 'B', true];
arr.pop();
// <· true
// arr -> [1, 2, 'a', 'B'];

// 对空数组 pop 不会报错，而会返回 undefined
arr.pop();
arr.pop();
arr.pop();
arr.pop();
arr.pop();
// <· undefined

/* unshift and shift */
// unshift() 向 Array 的头部添加若干元素，返回信道数组长度
// shift() 删除 Array 的第一个元素，返回第一个元素
arr = [1, 2];
arr.unshift('A', 'B');
// <· 4
// arr -> ["A", "B", 1, 2];

arr.shift();
// <· "A"
// arr -> ["B", 1, 2];

// 对空数组 shift() 也会返回 undefined

/* sort */
arr = ['B', 'A', 'C'];
arr.sort()
// arr -> ["A", "B", "C"];

/* reverse */
// 反转数组
arr = ['one', 2, 'three'];
arr.reverse();
// arr -> ["three", 2, "one"];

/* splice */
// 修改数组的万能方法
arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
start = 2;
deleteCount = 3;
var items = ['Google', 'Facebook'];
// 从 start 开始，删除 deleteCount 个元素，在从该位置添加 items
// 返回删除的元素
arr.splice(start, deleteCount, items[0], items[1]);
// <· ["Yahoo", "AOL", "Excite"]
// arr -> ["Microsoft", "Apple", "Google", "Facebook", "Oracle"]

// 只删不加
arr.splice(2, 2);
// <· ["Google", "Facebook"]
// arr -> ["Microsoft", "Apple", "Oracle"]

// 只加不删
arr.splice(2, 0, 'Google', 'Facebook');
// <· [] (返回空数组，因为没有删除东西)
// arr -> ["Microsoft", "Apple", "Google", "Facebook", "Oracle"]


/* concat */
// 连接两个数组
arr = ['A', 'B', 'C'];
var added = arr.concat([1, 2, 3]);
// added -> ["A", "B", "C", 1, 2, 3]

// concat() 可以接受任意个元素和数组，并把数组拆开，添加到新的 Array 中
arr.concat(1, 2, [3, 4]);
// <· ["A", "B", "C", 1, 2, 3, 4]

/* join */
// join() 方法把当前数组中的每个元素用指定的字符串连接起来，然后返回连接后的字符串
arr = ['A', 'B', 'C', 1, 2, 3];
arr.join('--');
// <· "A--B--C--1--2--3"

/* 多维数组 */
arr = [[1, 2, 3], [4, 5, 6], '-'];
arr[1][0];
// <· 4